package Form;

import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;

import CodeAdmin.Code;
import Creche.Bd.BD;

public class CodeForm {

	private static final String CHAMP_STATUT = "statut";
	private static final String CHAMP_EMAIL = "email";
	
	//private static final String HOST = "smtp.gmail.com";
	private static final String FROM = "pks@crechebook10.mygbiz.com";
	private static final String SUBJECT = "Code Admin";
	//private static final String PASS = "l3infopks";
    
    private String resultat;
    private HashMap<String,String> erreurs = new HashMap<String,String>();
    
    /**
     * @return le resultat du formulaire
     */
    public String getResultat() {
        return resultat;
    }
    
    
    /**
     * @return la map des erreurs saisis dans le formulaire
     */
    public HashMap<String,String> getErreurs() {
        return erreurs;
    }
    
    
    /**
     * Génére et retourne un code selon le statut
     * choisi après validation du formulaire
     * @param requette de la servlet
     * @param code à générer
     */
    public Code genCode(HttpServletRequest req, Code code) {
    	
    	String statut = req.getParameter(CHAMP_STATUT);
        BD myBD = new BD();
        
        /* Validation du champ code */
        try {
        	validationCode(statut);
        	boolean bool = Boolean.parseBoolean(statut);
        	code = createCode(bool,myBD);
        } catch (Exception e) {
            setErreur(CHAMP_STATUT, e.getMessage());
        }
        
        /* Initialisation du résultat global de la validation */
        if (erreurs.isEmpty()) {
        	resultat = "Code générer";
        } 
        else {
            resultat = "Echec de la création du code";
        }
        
        return code;
    }
    
    
    /**
     * Envoie le code admin à l'adresse email
     * @param requette de la servlet
     * @param code généré
     */
    public void sendCode(HttpServletRequest req, String code) {
    	
    	String email = req.getParameter(CHAMP_EMAIL);
    	
    	/* Validation du champ email */
        try {
            validationEmail(email);
        } catch (Exception e) {
            setErreur(CHAMP_EMAIL, e.getMessage());
        }
        
        if (erreurs.isEmpty()) {
        	resultat = "Email envoyé";
        	MailForm mail = new MailForm();
			String body = "Voici votre code : " + code;
			
			try {
	            //mail.connect(HOST, FROM, PASS);
	            mail.send(FROM, email, SUBJECT, body);
	            
	        } catch (MessagingException ex) {
	            Logger.getLogger(MailForm.class.getName()).log(Level.SEVERE, null, ex);
	        }
		}
        else {
        	resultat = "Echec de l'envoi du mail";
        }
    }
    
    
    /**
     * Crée un message d'erreur si code non choisi
     * @param code choisi par l'administrateur
     */
    private void validationCode(String code) throws Exception {
        if (code.isEmpty()) {
            throw new Exception("Veuillez choisir un statut");
        }
    }
    
    
    /**
     * Crée un message d'erreur si email invalide ou non saisi
     * @param email saisi par l'utilisateur
     */
    private void validationEmail(String email) throws Exception {
        if (!email.isEmpty()) {
            if (!email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" )) {
                throw new Exception("Adresse email invalide");
            }
        } 
        else {
            throw new Exception("Veuillez saisir une adresse email");
        }
    }
    
    
    /**
     * Enregistre le résultat
     * @param résultat (message d'erreur)
     */
    public void setResultat(String resultat) {
        this.resultat = resultat;
    }
    
    
    /**
     * Ajoute dans la map des erreurs le message correspondant au champ
     * @param champ du formulaire
     * @param message d'erreurs
     */
    private void setErreur(String champ, String message) {
        erreurs.put(champ, message);
    }
    
    
    /**
     * Crée un code admin ou superAdmin suivant le cas
     * @param booléen définissant le statut de l'admin
     * @param base de données
     * @return code admin
     */
    private Code createCode(boolean bool, BD myBD) {
    	Code c = new Code(bool);
    	
    	if (myBD.getCode(c.getCode()) != null) {
    		return createCode(bool,myBD);
    	}
    	else {
    		myBD.estPersistent(c);
        	return c;
    	}
    }
}
